perm filename RECOG.OSA[1,ALS] blob sn#001064 filedate 1972-07-11 generic text, type T, neo UTF8
00010	BEGIN "RECOG"
00020	DEFINE ⊂="COMMENT";	⊂ 7/11/72;
00030	⊂ This is the master program for the use of signature tables in
00040	speech recognition. It calls on a number of MAC routines for
00050	much of the actual work but this program sets up the tables
00060	as defined by an auxillary file which may be changed or replaced
00070	without any alteration to this program as written or to its 
00080	subroutines;
00090	
00100	LABEL LZZZZ;
00110	REQUIRE "COMSUB.HDR[SYS,ALS]" SOURCE_FILE;
00120	
00130	REQUIRE "PREPAR[SYS,THO]" LOAD_MODULE;
00140	REQUIRE "SIG[SYS,ALS]" LOAD_MODULE;
00150	REQUIRE "DPYOLD.HDR[1,THO]" SOURCE_FILE;
00160	FORTRAN REAL PROCEDURE SQRT(REAL X);
00170	FORTRAN REAL PROCEDURE ALOG10(REAL X);
00180	FORTRAN REAL PROCEDURE COS(REAL X);
00190	FORTRAN REAL PROCEDURE SIN(REAL X);
00200	REQUIRE "FFT8X[1,THO]" LOAD_MODULE;
00210	EXTERNAL FORTRAN PROCEDURE FRXFM(REFERENCE INTEGER M;
00215					REFERENCE REAL X,Y);
00220	DEFINE DPYSIZ="1000";
00230	⊂ INTEGER ARRAY DPYBUF[1:DPYSIZ];INTEGER DPPOINT,DPP1,DPP2,DATSHIFT;
00240	
00250	EXTERNAL PROCEDURE PREPARE;
00260	EXTERNAL FORTRAN PROCEDURE SIG(REFERENCE INTEGER P);
00270	EXTERNAL PROCEDURE TIMSET;
00280	EXTERNAL REAL PROCEDURE RUNTIM;
00290	EXTERNAL STRING PROCEDURE INCHWL;
00310	
00320	DEFINE BPS="12";
00330	DEFINE DATSIZ="1280",BUFEXS="43",BUFSIZ="1323",
00335		TABSIZ="7400",LISSIZ="1000",INSIZ="24";
00340	DEFINE BYTE="((ILDB(BPT) LSH 24)%2↑24)";
00350	DEFINE LBYT="ILDB(LBPT)";
00360	DEFINE LBYTE="((ILDB(LBPT) LSH 24)%2↑24)";
00362	DEFINE TBLSIZ="250";
00364	
00370	STRING FILI,TFILEI,TFILE,FILEI,OPT0,OPT1,OPT2,OPT3;
00380	INTERNAL INTEGER ARRAY DATBUF[0:BUFSIZ];
00390	INTERNAL INTEGER ARRAY TABLES[0:TABSIZ];
00400	INTERNAL INTEGER ARRAY PHLIST,HLIST[00:63];
00410	INTERNAL INTEGER ARRAY LIST[0:LISSIZ];
00420	INTERNAL INTEGER ARRAY FLIST[0:35];
00430	INTEGER ARRAY LFILE[0:'177];
00440	INTERNAL REAL ARRAY A,B,C[0:256];
00450	REAL X,SX;
00460	REAL ARRAY WINDOW[0:256];
00470	INTEGER ARRAY D[0:992];
00480	INTERNAL INTEGER ARRAY INNAM[0:INSIZ];
00490	INTERNAL INTEGER ARRAY INCNT,INSUB,INDIV,INRAW,INDAT[0:INSIZ];
00500	INTEGER CHAN1,CHAN2,CHAN3,CHAN4,CHAN5,CHAN6,EOF,IEOF;
00510	INTEGER BPT,BPTFST,BPTSAV,LBPT,SEGCNT,SEGTOT;
00520	INTEGER H,I,J,K,L;
00530	INTERNAL INTEGER M,N,P,RATE,STEPS,INFLAG,FLAG;
00540	INTERNAL INTEGER SEGC,SEGMRK,SEGSAV;
00550	INTERNAL INTEGER INTOT,PONY,HINT,UPCNT,TEACH;
00560	INTERNAL INTEGER I1L,I1H,I2L,I2H,I3L,I3H,  INL,INH,NZRNG,
00565		  FP1L,FP1H,FP2L,FP2H,
00570	            ILPB,ILPC,  IHPB,IHPC ;
00580	INTERNAL INTEGER NF; ⊂ *** USED IN PREPARE;
00582	INTERNAL INTEGER ARRAY TABLET[0:TBLSIZ],TBLIS[0:TBLSIZ%5];
00584	INTERNAL INTEGER TFLAG;
00585	INTERNAL INTEGER ZEROF,ZEROC;
00586	
00590	LABEL START;
00600	LABEL LABELA,LABELB,ZZZZ;
00610	STRING READ1,READ2,PREHINT,STEPX,STPMOD;
00620	INTEGER HCOUNT,HINDEX;
00622	STRING RECMOD; INTEGER ARRAY LEV1,LEV2,LEV3,SEG1,SEG2,SEG3[0:20];
00624		       INTEGER CON1,CON2,CON3;
00626	
00630	⊂	****SET UP****;
     

00010	PROCEDURE ARRDIS(INTEGER ARRAY A; INTEGER N,XPOS,YPOS;STRING ID);
00020	BEGIN
00030	COMMENT DISPLAYS A HISTOGRAM OF THE FIRST N VALUES
00035		 OF ARRAY A AT XPOS,YPOS;
00040	INTEGER I,J,SP;
00050	INTEGER LY,DY;
00060	INTEGER MAX;
00070	MAX←0;
00080	FOR I←0 STEP 1 UNTIL N DO
00090	  IF ABS(A[I])>MAX THEN MAX←ABS(A[I]);
00100	MAX←MAX/256;
00110	SP←1024%N;  COMMENT HORIZONTAL SPACING;
00120	AIVECT(XPOS,YPOS); RVECT(1023,0); RIVECT(-1023,0); RVECT(0,256);
00130	LY←A[0]/MAX+YPOS;
00140	AIVECT(XPOS,LY);
00150	FOR I←1 STEP 1 UNTIL N-1 DO
00160	BEGIN
00170		DY←A[I]/MAX+YPOS-LY;
00180		LY←LY+DY;
00190		RVECT(SP,DY);
00200	END;
00210	AIVECT(XPOS,YPOS);
00220	FOR I←1 STEP 1 UNTIL 10 DO
00230	BEGIN
00240	  RVECT(0,-15);    COMMENT INSERT HORIZONTAL SCALE;
00250	  RIVECT(26,15);
00260	  RVECT(0,-5);
00270	  RIVECT(26,5);
00280	  RVECT(0,-10);
00290	  RIVECT(26,10);
00300	  RVECT(0,-5);
00310	  RIVECT(26,5);
00320	END;
00330	RVECT(0,-15);
00340	AIVECT(XPOS,YPOS-40);
00350	DPYSST("0       1        2        3       4        5        6       7        8        9       10");
00360	AIVECT(XPOS,YPOS-60);
00370	DPYSST(ID);
00380	END "ARRDIS";
00390	
00400	PROCEDURE DATDIS(INTEGER ARRAY A; INTEGER N,XPOS,YPOS;STRING ID);
00410	BEGIN
00420	COMMENT DISPLAYS A HISTOGRAM OF THE FIRST N VALUES
00425		 OF ARRAY A AT XPOS,YPOS;
00430	INTEGER I,J,SP;
00440	INTEGER LY,DY;
00450	SP←1024%N;  COMMENT HORIZONTAL SPACING;
00460	AIVECT(XPOS,YPOS); RVECT(1023,0);
00470	LY←A[0]/18+YPOS;
00480	AIVECT(XPOS,LY);
00490	FOR I←1 STEP 1 UNTIL N-1 DO
00500	BEGIN
00510		DY←A[I]/18+YPOS-LY;
00520		LY←LY+DY;
00530		RVECT(SP,DY);
00540	END;
00550	AIVECT(XPOS,YPOS-60); DPYSST(ID);
00560	END "DATDIS";
00570	
00580	PROCEDURE RARDIS(REAL ARRAY C; INTEGER N,XPOS,YPOS;STRING ID);
00590	BEGIN
00600	COMMENT DISPLAYS A HISTOGRAM OF THE FIRST N VALUES
00605		 OF ARRAY A AT XPOS,YPOS;
00610	INTEGER I,J,SP;
00620	INTEGER LY,DY;
00630	REAL MAX;
00640	MAX←0;
00650	FOR I←0 STEP 1 UNTIL N DO
00660	  IF ABS(C[I])>MAX THEN MAX←ABS(C[I]);
00670	MAX←MAX/256;
00680	SP←1024%N;  COMMENT HORIZONTAL SPACING;
00690	AIVECT(XPOS,YPOS); RVECT(1023,0); RIVECT(-1023,0); RVECT(0,256);
00700	LY←C[0]/MAX+YPOS;
00710	AIVECT(XPOS,LY);
00720	FOR I←1 STEP 1 UNTIL N-1 DO
00730	BEGIN
00740		DY←C[I]/MAX+YPOS-LY;
00750		LY←LY+DY;
00760		RVECT(SP,DY);
00770	END;
00780	AIVECT(XPOS,YPOS);
00790	FOR I←1 STEP 1 UNTIL 10 DO
00800	BEGIN
00810	  RVECT(0,-15);    COMMENT INSERT HORIZONTAL SCALE;
00820	  RIVECT(26,15);
00830	  RVECT(0,-5);
00840	  RIVECT(26,5);
00850	  RVECT(0,-10);
00860	  RIVECT(26,10);
00870	  RVECT(0,-5);
00872	  RIVECT(26,5);
00874	END;
00900	RVECT(0,-15);
00910	AIVECT(XPOS,YPOS-40);
00920	DPYSST("0       1        2        3       4        5        6        7       8       9       10");
00930	AIVECT(XPOS,YPOS-60);
00940	DPYSST(ID);
00950	END "RARDIS";
00960	
00970	INTERNAL PROCEDURE XRTRAN(REAL ARRAY A,B;INTEGER N,EVALUATE);
00980	BEGIN
00990	COMMENT IF EVALUATE IS FALSE THIS INTERNAL PROCEDURE UNSCRAMBLES
00995		  THE SINGLE VARIATE COMPLEX TRANSFORM ;
01010	INTEGER K,NK,NH;
01020	REAL AA,AB,BA,BB,RE,IM,CK,SK,DC,DS,R;
01030	NH←N%2;  R←3.1415926536/N;
01040	DS←SIN(R); R←-(2*SIN(0.5*R))↑2;
01050	DC←-0.5*R; CK←1.0;  SK←0;
01060	IF EVALUATE THEN
01070	BEGIN
01080	CK←-1.0; DC←-DC;
01090	END
01100	ELSE
01110	BEGIN
01120	A[N]←A[0]; B[N]←B[0];
01130	END;
01140	FOR K←0 STEP 1 UNTIL NH DO
01150	BEGIN
01160		NK←N-K;
01170		AA←A[K]+A[NK]; AB←A[K]-A[NK];
01180		BA←B[K]+B[NK]; BB←B[K]-B[NK];
01190		RE←CK*BA+SK*AB;  IM←SK*BA-CK*AB;
01200		B[NK]←IM-BB; B[K]←IM+BB;
01210		A[NK]←AA-RE; A[K]←AA+RE;
01220		DC←R*CK+DC; CK←CK+DC;
01230		DS←R*SK+DS; SK←SK+DS;
01240	END;
01250	END "XRTRAN";
     

00010	COMMENT		MACROS;
00020	DEFINE ⊂="COMMENT",CR="'15",LF="'12",FF="'14",TB="'11";
00030	DEFINE CRLF="CR&LF", CRLF0="CR&'177&'21"; ⊂ FOR CRLF W/O FORM FEED;
00040	DEFINE TTY="'14",DSK="'13",BDSKO="'12",
00050		DPY="'11",BDSKI="'10",TMP="'0";
00060	DEFINE TIL="STEP 1 UNTIL";
00070	DEFINE BDSK="'10",GPH="'11",DSKO="GPH",HP="'7",
00080		HPLIST="'6",MUS="'4",ED="'3";
00090	INTEGER K.,J.; ⊂ USED IN MACROS;
00100	DEFINE ERROR(I)="OUT(TTY,""ERROR""&CVS(I))";
00110	DEFINE ISQRT(I)="(K.←(I)↑0.5)";
00120	DEFINE ODD(I)="((I) MOD 2)", EVEN(I)="¬ODD(I)";
00130	DEFINE ABS(I)="(IF I<0 THEN -I ELSE I)";
00140	DEFINE NONNEG(I)="(IF I<0 THEN 0 ELSE I)";
00150	DEFINE TRACE(N)="OUTSTR(""[""&CVS(N)&""]""(";
00160	DEFINE LTRACE(N)="OUTSTR(CR&LF&""[""&CVS(N)&""]"")";
00170	DEFINE FTRACE(N)=
00180	  "BEGIN INTEGER F1,F2; GETFORMAT(F1,F2); SETFORMAT(0,7);
00190	   OUTSTR(""[""&CVF(N)&""]""); SETFORMAT(F1,F2) END";
00200	DEFINE DATE="DATIME(""DATE"")", TIME="DATIME(""TIME"")";
00210	DEFINE MOVEADR(ADR,ARRAY)=
00220		"QUICK_CODE MOVE 11,ARRAY;MOVEM 11,ADR;END";
00230	DEFINE PI="3.141592653",PICON="(PI/180)";
00240	DEFINE INFINITY="'377777777777";
00250	STRING PARMS; ⊂ HOLDS CONTENTS OF PARMFILE;
00260	
00270	INTERNAL PROCEDURE SETBR;
00280	BEGIN
00290	  SETBREAK(1,CR,LF,"IN");
00300	  SETBREAK(2,CR&",",LF&TB&" ","IN");
00310	  SETBREAK(3,NULL,NULL,"IN");
00320	  SETBREAK(4,CR&TB&" ",LF&",","IN");
00330	  SETBREAK(5,CR,LF,"ISP"); ⊂ SKIP CR&LF, KEEP LINE NBR AND TAB;
00340	  SETBREAK(6,CR&TB&" ",LF&".,","IN");
00350	  SETBREAK(7,NULL,0,"I"); ⊂ TO REMOVE NULL CHARACTERS FROM STRING;
00360	  SETBREAK(8, "=←;[("&CR , LF&" ])" , "IN");
00370	  SETBREAK(9,NULL,0&" "&CR&LF&TB,"IN");
00380		 ⊂ READS ENTIRE FILE, OMITTING LINE
00390	    NUMBERS, NULLS, BLANKS, CR`S, LF`S, TB`S;
00400	  SETBREAK(10," "&TB&CR,"0123456789"&LF,"IN");
00410	  SETBREAK(11,NULL,0,"IN");
00420		 ⊂ READS ENTIRE FILE, OMITTING LINE NUMBERS,
00430	    AND NULLS;
00440	END "SETBR";
00450	
00460	
00470	INTERNAL PROCEDURE LOOKIN(INTEGER CHAN; REFERENCE STRING FILENAME);
00480	BEGIN ⊂ REQUIRES SETBREAK(1,CR,LF,"IN");
00490	  BOOLEAN NF;
00500	  LOOKUP(CHAN,FILENAME,NF);
00510	  WHILE NF DO
00520	  BEGIN
00530	    OUTSTR(CR&LF&"Can't find "&FILENAME&". File=");
00540	    FILENAME ← INPUT(TTY,1);
00550	    LOOKUP(CHAN,FILENAME,NF)
00560	  END;
00570	END "LOOKIN";
00580	
00590	
00600	PROCEDURE TELL;
00610	BEGIN
00620	INTEGER TELPPT,TELQPT;
00630	⊂ To report on the performance of the signature tables;
00640	INTEGER I,J,K,L,HPOINT,MX,IX;
00650	
00660	OUTSTR(CRLF&"HINT: "&CVXSTR(PHLIST[H])&TB);
00670	
00680	HPOINT←POINT(1,HLIST[H],-1);
00690	FOR I←0 STEP 1 UNTIL 35 DO
00700	   IF (K←ILDB(HPOINT))=1 THEN OUTSTR(CVXSTR(FLIST[I])&" ");
00710	OUTSTR(CRLF&"INPUT:"); SETFORMAT(3,0);
00720	   FOR I←0 STEP 1 UNTIL 18 DO OUTSTR(CVS(INDAT[I]));
00730	OUTSTR("  "&CVS(ZEROC));
00740	OUTSTR(CRLF&LF&"Table"&TB&"Type"&TB&"Learn"&TB&"Output"&CRLF);
00750	SETFORMAT(1,0);
00760	L←INTOT;
00770	FOR I←INTOT*74 STEP 74 UNTIL TABSIZ DO BEGIN
00780	 IF TABLES[I+1]=0 THEN DONE ELSE BEGIN "DECODE"
00790		 STRING LEARN; INTEGER K1,K2,K3,K4;
00800	    IF LIST[L+LISSIZ%10]≥CVSIX("Q0") THEN BEGIN
00810	       K←LIST[L+LISSIZ%5]; K1←K LSH -18; K2←(K LSH 18) LSH -30;
00820	       K3←(K LSH 24) LSH -30; K4←(K LSH 30) LSH -30;
00830	       LEARN←CVXSTR(PHLIST[K1])[1 TO 2]&CVXSTR(PHLIST[K2])[1 TO 2]&
00840	             CVXSTR(PHLIST[K3])[1 TO 2]&CVXSTR(PHLIST[K4])[1 TO 2];
00850						  END 
00860	          ELSE LEARN←CVXSTR(LIST[L+LISSIZ%5]);
00870	 OUTSTR(CVXSTR(LIST[L])&TB&CVXSTR(LIST[L+LISSIZ%10])&LEARN&TB);
00880	 				END "DECODE";
00890	 OUTSTR(CVS(LDB(POINT(3,TABLES[I],2))));
00900	 IF LDB(POINT(1,TABLES[I+1],5))≠0 THEN  BEGIN
00910	  OUTSTR(TB&CVS(LDB(POINT(3,TABLES[I],5)))&TB&
00920		CVS(LDB(POINT(3,TABLES[I],8)))
00930		   &TB&CVS(LDB(POINT(3,TABLES[I],11))));
00940	 OUTSTR(TB&CVS(LDB(POINT(3,TABLES[I],14)))); L←L+1;I←I+74 END;
00950	 OUTSTR(CRLF);
00960	L←L+1;
00970	 END;
00980	IF TFLAG≠0 THEN BEGIN    L←0; 
00990	OUTSTR(CRLF&"Name"&TB&"Input"&TB&"Level"&TB&"Hyst"&
01000		TB&"Prob"&TB&"St.Seg"&TB&"SegCnt"&CRLF);
01010		 FOR I←0 STEP 5 UNTIL TBLSIZ DO  BEGIN
01020	IF TABLET[I+1]=0 THEN DONE ELSE 
01030	IF (LDB(POINT(5,TABLET[I+2],12)))>0 THEN BEGIN "COUNT"
01040		   OUTSTR(CVXSTR(TABLET[I+1])&TB&CVXSTR(TBLIS[L])&TB&
01050			          CVS(LDB(POINT(3,TABLET[I+2],3)))&TB&
01060				  CVS(LDB(POINT(2,TABLET[I+2],5)))&TB&
01070				  CVS(LDB(POINT(3,TABLET[I],2)))&TB&
01080				  CVS(LDB(POINT(8,TABLET[I],10)))&TB&
01090				  CVS(LDB(POINT(7,TABLET[I],17)))&CRLF);
01100	               	END "COUNT";   L←L+1;   END;  END;
01110	
01120	
01130	OPEN(CHAN6,"DSK",0,2,'10,0,0,EOF);
01140	LOOKUP(CHAN6,"TELL.DOC",0);
01150	 DEFINE UGETF="'073000000000";
01160	START_CODE;
01170	 UGETF	6,I;
01180	END;
01190	ENTER(CHAN6,"TELL.DOC",0);
01200	USETO(CHAN6,I);
01210	
01220	SETFORMAT(2,0); OUT(CHAN6,CVS(SEGC)&"  "); SETFORMAT(4,0);
01230	FOR I←0 STEP 2 UNTIL 18 DO OUT(CHAN6,CVS(INDAT[I]));
01240	SETFORMAT(2,0); OUT(CHAN6,"  ");
01250	FOR I←INTOT STEP 1 UNTIL LISSIZ-1 DO BEGIN
01260	 IF LIST[I]=0 THEN DONE;
01270	 J←I*74;
01280	TELPPT←POINT(3,TABLES[J],2);
01290	⊂ TELQPT←POINT(3,TABLES[J],17);
01300	IF LIST[I+LISSIZ%10]≥CVSIX("Q0") THEN BEGIN
01310	   MX←0; IX←0;
01320	   FOR K←1 STEP 1 UNTIL 4 DO BEGIN
01330	       L←LDB(POINT(3,TABLES[J],K*3+2));
01340		IF L>MX THEN BEGIN MX←L; IX←K END; END;
01350		IF MX=0 THEN IX←0;
01360	
01370	 OUT(CHAN6,CVS(MX)); ⊂  IX←MX  TEMPORARY ;
01380	 I←I+1;
01390	END ELSE
01400	 OUT(CHAN6,CVS(LDB(TELPPT)));
01410	END;
01420	OUT(CHAN6,CRLF&"   "&CVXSTR(PHLIST[H])[1 TO 3]); SETFORMAT(4,0);
01430	FOR I←1 STEP 2 UNTIL 18 DO OUT(CHAN6,CVS(INDAT[I]));
01440	OUT(CHAN6,CRLF);
01450	IF TFLAG≠0 THEN BEGIN    L←0; TFLAG←0;
01460	OUT(CHAN6,CRLF&"Name"&TB&"Input"&TB&"Level"&TB&"Hyst"&TB&
01465	"Prob"&TB&"St.Seg"&TB&"SegCnt"&CRLF);
01472		 FOR I←0 STEP 5 UNTIL TBLSIZ DO  BEGIN
01480	IF TABLET[I+1]=0 THEN DONE ELSE
01485	 IF (LDB(POINT(5,TABLET[I+2],12)))>0 THEN  BEGIN "COUNT"
01490		   OUT(CHAN6,CVXSTR(TABLET[I+1])&TB&CVXSTR(TBLIS[L])&TB&
01500			          CVS(LDB(POINT(3,TABLET[I+2],3)))&TB&
01510				  CVS(LDB(POINT(2,TABLET[I+2],5)))&TB&
01520				  CVS(LDB(POINT(3,TABLET[I],2)))&TB&
01530				  CVS(LDB(POINT(8,TABLET[I],10)))&TB&
01540				  CVS(LDB(POINT(7,TABLET[I],17)))&TB&
01550	CRLF);
01560	J←LDB(POINT(8,TABLET[I+2],7)); K←LDB(POINT(23,TABLET[I+2],35));
01570	TABLET[I+2]←0; TABLET[I+2]←J LSH 28 +   K  ;
01575	 END "COUNT"; L←L+1; END;  END;
01580	CLOSE(CHAN6);
01590	END "TELL";
01600	
01610	STRING PROCEDURE HEADER;
01620	BEGIN STRING H1,H2; INTEGER I,J,K;
01630	   IF HCOUNT>0 THEN BEGIN HCOUNT←HCOUNT-1; RETURN(PREHINT) END 
01640	                  ELSE WHILE HCOUNT=0 DO BEGIN "XX"
01650	  I←LFILE[HINDEX];  K←LDB(POINT(7,I,30)); J←SEGC-K; 
01660	 
01670	   IF I=0 THEN BEGIN PREHINT←""; HCOUNT←99; RETURN(PREHINT) END;
01680	   IF J ≥ 0 THEN BEGIN "LATCH"
01690	          H1←CVXSTR(LDB(POINT(12,I,11)) LSH 24);
01700	          H2←CVXSTR(LDB(POINT(12,I,23)) LSH 24);
01710	   IF EQU(H1,H2) THEN BEGIN PREHINT←H1;HCOUNT←LDB(POINT(5,I,35));
01720	      HCOUNT←HCOUNT-J;
01730	    HINDEX←HINDEX+1; RETURN(PREHINT); DONE 
01740				END
01750		 ELSE BEGIN PREHINT←""; HCOUNT←LDB(POINT(5,I,35));
01760	     HCOUNT←HCOUNT-J; HINDEX←HINDEX+1; RETURN(PREHINT); DONE;
01770	 			END;
01780					   END "LATCH";
01790			PREHINT←""; RETURN(PREHINT); END "XX";
01800	END "HEADER";
01810	
01820	PROCEDURE REPORT;
01830	BEGIN "REP"
01840	   STRING LAB;  INTEGER OUT,I,J,K,L;
01850	   IF TFLAG≠0 THEN BEGIN
01860		TFLAG←0;
01870	        FOR I←0 STEP 5 UNTIL TBLSIZ DO  BEGIN
01880	IF TABLET[I+1]=0 THEN DONE ELSE
01885	  IF (LDB(POINT(5,TABLET[I+2],12)))>0 THEN BEGIN "CT"
01890		LAB←CVXSTR(TABLET[I+1]);
01895		  OUT←LDB(POINT(18,TABLET[I],17)) LSH 18 ;
01900		IF EQU(LAB,"VOI-C ")∨EQU(LAB,"FRI-C ") THEN
01910		BEGIN  LEV1[CON1]←TABLET[I+1];
01920		       SEG1[CON1]←OUT;  CON1←CON1+1; END
01930	ELSE IF EQU(LAB,"VOWEL ")∨EQU(LAB,"GLIDE ")∨EQU(LAB,"NASAL ")
01940			∨EQU(LAB,"BURST ")∨EQU(LAB,"STOP  ")  THEN
01950		BEGIN LEV2[CON2]←TABLET[I+1];
01960		      SEG2[CON2]←OUT;   CON2←CON2+1; END
01970		ELSE  BEGIN  LEV3[CON3]←TABLET[I+1];
01980		              SEG3[CON3]←OUT; CON3←CON3+1; END;
01990	
02000	J←LDB(POINT(8,TABLET[I+2],7)); K←LDB(POINT(23,TABLET[I+2],35));
02010	TABLET[I+2]←0; TABLET[I+2]←J LSH 28 +   K  ; END "CT"; END;  END;
02020	END "REP";
02030	
     

00010	SETBR;
00020	UPCNT←3;
00030	FILEI←"TOO1.DAT[1,THO]";OPT1←"N";OPT2←"N";OPT3←"0"; M←8;INFLAG←0;
00040	CHAN1←1; CHAN2←2; CHAN3←3;  CHAN4←4; CHAN5←5; CHAN6←6;
00050	CLOSE(CHAN1);
00060	  OPEN(CHAN1,"DSK",'10,10,0,0,0,EOF);
00070	  LOOKUP(CHAN1,"TABLES.DAT",0);
00080	ARRYIN(CHAN1,INSUB[0],INSIZ);
00090	ARRYIN(CHAN1,INDIV[0],INSIZ);
00100	ARRYIN(CHAN1,INCNT[0],INSIZ);
00110	ARRYIN(CHAN1,INNAM[0],INSIZ);
00120	ARRYIN(CHAN1,FLIST[0],36);
00130	ARRYIN(CHAN1,PHLIST[0],64);
00140	ARRYIN(CHAN1,HLIST[0],64);
00150	ARRYIN(CHAN1,TABLES[0],TABSIZ);
00155	ARRYIN(CHAN1,TABLET[0],TBLSIZ);
00160	
00170	CLOSE(CHAN5); CLOSE(CHAN6);
00180	OPEN(CHAN5,"DSK",'10,10,0,0,0,EOF);
00190	LOOKUP(CHAN5,"SIGLST.DAT",0);
00200	ARRYIN(CHAN5,LIST[0],LISSIZ);
00210	INTOT←WORDIN(CHAN5);
00212	ARRYIN(CHAN5,TBLIS[0],TBLSIZ%5);
00220	RELEASE(CHAN5);
00300	OPEN(CHAN6,"DSK",0,2,'10,0,0,EOF);
00310	ENTER(CHAN6,"TELL.DOC",0);
00320	OUT(CHAN6,TB&"Session iniated "&DATIME&CRLF); CLOSE(CHAN6);
00330	START:
00560	 IF (TFILEI←STRIN("DATA FILE("&FILEI&") = "))≠"" THEN FILEI←TFILEI;
00575	    M←8;
00590	N←2↑M;  NF←2*N;
00600	FOR I←0 STEP 1 UNTIL N DO
00610	 WINDOW[I]←(1-COS((2*PI*I)/N))/2;
00620	
00622	 FOR I←0 STEP 5 UNTIL TBLSIZ-5 DO BEGIN IF TABLET[I+1]=0 THEN DONE;
00623	J←LDB(POINT(8,TABLET[I+2],7));  K←LDB(POINT(23,TABLET[I+2],35));
00624	  TABLET[I+2]←0;   TABLET[I+2]←J LSH 28 +   K  ;   END ;
00625		OUTSTR(CRLF&"Do you want TELL ? YorCR = "); OPT1←INCHWL;
00627	FOR I←0 STEP 1 UNTIL 10 DO BEGIN LEV1[I]←LEV2[I]←LEV3[I]←0;
00629	SEG1[I]←SEG2[I]←SEG3[I]←0; END;
00630	N←2↑M;
00640	OPEN(CHAN6,"DSK",0,2,'10,0,0,EOF);
00650	LOOKUP(CHAN6,"TELL.DOC",0);
00660	 DEFINE UGETF="'073000000000";
00670	START_CODE;
00680	 UGETF	6,I;
00690	END;
00700	ENTER(CHAN6,"TELL.DOC",0);
00710	USETO(CHAN6,I);
00720	OUT(CHAN6,CRLF&DATIME&"  Data file "&FILEI&" WITH "&
00721		CVS(SEGTOT)&" SEGMENTS."&CRLF&LF&"SEG.  ");
00722		IF OPT1="Y" THEN BEGIN
00724	
00730	FOR I←0 STEP 2 UNTIL 18 DO OUT(CHAN6,CVXSTR(INNAM[I])[1 TO 4]);
00740	FOR I←INTOT STEP 2 UNTIL LISSIZ-1 DO BEGIN
00750	 IF LIST[I]=0 THEN DONE;
00760	 OUT(CHAN6,CVXSTR(LIST[I])[1 TO 3]&" ");
00770	 IF LIST[I+LISSIZ%10]≥CVSIX("Q0") THEN I←I+1;
00780	 IF LIST[I+1+LISSIZ%10]≥CVSIX("Q0") THEN I←I+1;
00790	END;
00800	OUT(CHAN6,CRLF&"  HINT  ");
00810	FOR I←1 STEP 2 UNTIL 17 DO OUT(CHAN6,CVXSTR(INNAM[I])[1 TO 4]);
00820	OUT(CHAN6,"    ");
00830	FOR I←INTOT+1 STEP 2 UNTIL LISSIZ-1 DO BEGIN
00840	 IF LIST[I]=0 THEN DONE;
00850	 OUT(CHAN6,CVXSTR(LIST[I])[1 TO 3]&" ");
00860	 IF LIST[I+LISSIZ%10]≥CVSIX("Q0") THEN I←I+1;
00870	 IF LIST[I+1+LISSIZ%10]≥CVSIX("Q0") THEN I←I+1;
00880	END;    END;
00890	OUT(CHAN6,CRLF&LF);
00900	CLOSE(CHAN6);
00902	⊂ OUTSTR(CRLF&
00903	"Do you want to run this file in RECOG mode?(hints=NU)YorCR = ");
00904	⊂   IF (RECMOD←INCHWL)="Y" THEN GO TO LABELA ;
00906	
01000	OUTSTR(CRLF&"Shift DATABUF by WORDS = ");
01010	DATSHIFT←CVD(INCHWL); ⊂  USE TO TEST PHASE SENSITIVITY OF LEARNING;
01020	
01030	LABELA:	CLOSE(CHAN4);
01040	OPEN(CHAN4,"DSK",'10,10,0,0,0,EOF);
01050	LOOKIN(CHAN4,FILEI);
01055	FOR I←0 STEP 5 UNTIL TBLSIZ DO IF TABLET[I+1]≠0 THEN TABLET[I]←'777777777777 ELSE DONE;
01060	EOF←0; SEGC←0; SEGCNT←0;
01070	ARRYIN(CHAN4,LFILE[0],'200);	⊂ Input header;
01080	SEGTOT←(LFILE[0]*6)%N; RATE←LFILE[2];
01085	 OUTSTR(CRLF&"SAM RATE ="&CVS(LFILE[2]));
01090	IF RATE=0 THEN RATE←CVD(STRIN("Sampling rate missing. Rate = "));
01100	⊂ **** SET PARAMETER RANGES 
01110	THE PARA LIMITS ARE (DOUBLE CHECK) 
01115		 F1=200/800  F2=700/2050  F3=2000/3200
01120	    NP=800/1500  NZRNG=NP+/-500 ?
01130	    FP1=1800/3200   FP2=3200/5000   LPE=300/450  HPE=2500/3000 ;
01140	⊂  *** I2H CHANGED FROM 28 TO 26 ESCAPE HI AMP F3 ;
01150	   SX←RATE/N;  I1L←200./SX ; I1H←800./SX+.5 ; 
01155		I2L←700./SX; I2H←2050./SX+.5;
01160	   I3L←1950./SX; I3H←3250./SX+.5; 
01170	   INL←800./SX; INH←1500./SX+.5; NZRNG←500./SX+.5;
01180	   FP1L←1800./SX;FP1H←3200./SX;FP2L←3200./SX+.5;FP2H←5000./SX+.5;
01190	   ILPB←300./SX; ILPC←450./SX; IHPC←2500./SX; IHPB←3000./SX;
01200	BPTFST←POINT(BPS,DATBUF[0],-1);
01201	IF DATSHIFT>0 THEN 
01210	ARRYIN(CHAN4,DATBUF[0],DATSHIFT);
01215	⊂ IF RECMOD≠"Y" THEN BEGIN  "PL"
02460	⊂ END;⊂  END "PL" ELSE ;  BEGIN "RECOG"  INTEGER I,J,K,L,SEGLIM;
02470		CON1←CON2←CON3←0;  SEGC←K←1;HINT←H←0;TABLES[2]←HLIST[0];
02474	
02480		ARRYIN(CHAN4,DATBUF[0],43);
02490		WHILE EOF=0 DO BEGIN "L1"
02500		ARRYIN(CHAN4,DATBUF[43],DATSIZ);
02510	
02520	      IF EOF≠0 THEN
02530		BEGIN
02540		  J←EOF LAND '777777;
02550		  FOR I←J STEP 1 UNTIL N-1 DO DATBUF[I]←0;
02560		END;
02570		BPT←BPTFST;
02580	
02590	  K←1;	WHILE K≤6*DATSIZ%N DO BEGIN "L2"
02592		INTEGER ISK,IS;
02594		ISK←((K-1)*128)%3-1; IF ISK<0 THEN ISK←0;
02596		BPT←POINT(BPS,DATBUF[ISK],-1); IS←(K-1)*128-(ISK+1)*3;
02598		FOR I←1 STEP 1 UNTIL IS DO L←ILDB(BPT); ⊂ POSITION PBT;
02600		
02610	 J←I←ZEROC←0; A[J]←BYTE*WINDOW[I]; B[J]←BYTE*WINDOW[I+1]; J←J+1;
02620		IF B[J]<A[J] THEN ZEROF←0 ELSE ZEROF←1;
02630	FOR I←2 STEP 2 UNTIL N-1 DO
02640	 BEGIN
02650	  A[J]←BYTE*WINDOW[I];
02660	IF A[J]<B[J-1] THEN ZEROF←0 ELSE
02665	 IF ZEROF=0 THEN BEGIN ZEROF←1; ZEROC←ZEROC+1; END;
02670	  B[J]←BYTE*WINDOW[I+1];
02680	IF B[J]<A[J] THEN ZEROF←0 ELSE
02685	 IF ZEROF=0 THEN BEGIN ZEROF←1; ZEROC←ZEROC+1; END;
02690	  J←J+1;
02700	 END;
02710	 FRXFM(M-1,A[0],B[0]);
02720	XRTRAN(A,B,N/2,FALSE);
02730	FOR I←0 STEP 1 UNTIL N/2 DO C[I]←5.*ALOG10(A[I]↑2+B[I]↑2);
02740		PREPARE;
02750		SIG(P); IF OPT1="Y" THEN TELL;
02760		REPORT; SETFORMAT(3,0); 
02770	
02780		SEGC←SEGC+1;  IF SEGC>SEGTOT THEN DONE;
02790		K←K+1;   END "L2";
02792		FOR I←0 STEP 1 UNTIL 42 DO DATBUF[I]←DATBUF[DATSIZ+1+I];
02794	
02800	
02810		IF SEGC>SEGTOT THEN BEGIN
02820		   FOR I←0 STEP 1 UNTIL INSIZ DO  INDAT[I]←0;
02830		   FOR I←0 STEP 1 UNTIL 4 DO BEGIN SIG(P);
02835		 REPORT END; DONE END;
02840		END "L1"; IF OPT1="Y" THEN TELL;
02850	
02855		BEGIN "DISP"
02858	 INTEGER ARRAY DPBUF[0:2000]; INTEGER LV,ST,CN,K1,K2,J1,J2;
02861	 INTEGER LOWLIM,ST1;
02862	
02864		DPYSET(DPBUF);  TYPLOC(-250,-510); SEGLIM←90; LOWLIM←0;
02870		CLOSE(CHAN4); OPEN(CHAN4,"DSK",'10,10,0,0,0,EOF);
02875	 LOOKIN(CHAN4,FILEI);
02880	ARRYIN(CHAN4,DATBUF[0],128);
02882	IF DATSHIFT>0 THEN ARRYIN(CHAN4,DATBUF[0],DATSHIFT);
02885	    WHILE SEGLIM≠0 DO BEGIN "L3" L←0;   WHILE EOF=0 DO BEGIN 
02889		      ARRYIN(CHAN4,DATBUF[0],DATSIZ);
02893	      IF EOF≠0 THEN
02897		BEGIN
02901		  J←EOF LAND '777777;
02905		  FOR I←J STEP 1 UNTIL DATSIZ-1 DO DATBUF[I]←0;
02909		END;
02913		LBPT←POINT(BPS,DATBUF[0],-1);
02917		FOR I←0 STEP 1 UNTIL 959 DO 
02921	BEGIN D[I]←LBYTE;J←ILDB(LBPT);J←ILDB(LBPT);J←ILDB(LBPT);END;
02925	   J←400-L*220; DATDIS(D,960,-511,J," ");
02927	 L←L+1; IF L*30≥SEGLIM-LOWLIM THEN DONE;
02929		END ;  
02933	
02937		FOR I←0 STEP 1 UNTIL CON1-1 DO BEGIN
02941		LV←LDB(POINT(3,SEG1[I],2)); ST1←LDB(POINT(8,SEG1[I],10));
02943	ST←ST1-LOWLIM;
02945		CN←LDB(POINT(7,SEG1[I],17));
02949		IF (ST≤90)∧(ST>0) THEN BEGIN
02953		J1←ST/30.3333;
02957		J←400-220*J1;
02961		K1←ST-J1*30; K←-511+32*(K1-1); SETFORMAT(1,0);
02965		AIVECT(K,J); AVECT(K,J-110);
02967	 RIVECT(5,0); DPYSST(CVS(ST1)); END;
02969	 
02973		ST←ST+CN+2; ST1←ST1+CN+2;
02977		IF (ST≤90)∧(ST>0) THEN BEGIN
02981		 J1←ST/30.3333; K1←ST-J1*30; K←-511+32*(K1-1);
02985		   J←400-220*J1;  
02989		AIVECT(K,J); AVECT(K,J-110);
02991	 RIVECT(5,0); DPYSST(CVS(ST1)); 
02993	     RIVECT(-10,-20); DPYSST("*"); END;
02997	
03001	
03005				END;
03009	
03013	
03017		FOR I←0 STEP 1 UNTIL CON2-1 DO BEGIN
03021		LV←LDB(POINT(3,SEG2[I],2));
03023	 ST1←LDB(POINT(8,SEG2[I],10));ST←ST1-LOWLIM;
03025		CN←LDB(POINT(7,SEG2[I],17));
03029		IF (ST≤90)∧(ST>0) THEN BEGIN
03033		J1←ST/30.3333;  J←400-220*J1; 
03037		K1←ST-J1*30; K←-511+32*(K1-1); SETFORMAT(1,0);
03041		AIVECT(K,J); AVECT(K,J-110)
03043	; RIVECT(5,0); DPYSST(CVS(ST1)); END;
03045	 
03049		ST←ST+CN+2; ST1←ST1+CN+2;
03053		IF (ST≤90)∧(ST>0) THEN BEGIN
03057		 J1←ST/30.3333; K1←ST-J1*30; K←-511+32*(K1-1);
03061	     J←400-220*J1;  
03065		AIVECT(K,J); AVECT(K,J-110); RIVECT(5,0); DPYSST(CVS(ST1)); 
03069				     RIVECT(-10,-20); DPYSST("*"); END;
03073	
03077				END;
03081		FOR I←0 STEP 1 UNTIL CON3-1 DO BEGIN
03085		LV←LDB(POINT(3,SEG3[I],2))
03087	; ST1←LDB(POINT(8,SEG3[I],10)); ST←ST1-LOWLIM;
03089		CN←LDB(POINT(7,SEG3[I],17));
03093		IF (ST≤90)∧(ST>0) THEN BEGIN
03097		J1←ST/30.3333;  J←400-220*J1; 
03101		K1←ST-J1*30; K←-511+32*(K1-1); SETFORMAT(1,0);
03105		AIVECT(K,J); AVECT(K,J-110);
03107	 RIVECT(5,0); DPYSST(CVS(ST1)); END;
03109	 
03113		ST←ST+CN+2 ; ST1←ST1+CN+2;
03117		IF (ST≤90)∧(ST>0) THEN BEGIN
03121		 J1←ST/30.3333; K1←ST-J1*30; K←-511+32*(K1-1);
03125	        J←400-220*J1;  
03129		AIVECT(K,J); AVECT(K,J-110);
03131	 RIVECT(5,0); DPYSST(CVS(ST1));
03133	     RIVECT(-10,-20); DPYSST("*"); END;
03137	
03141				END;  DPYOUT(1);
03145		
03149	OUTSTR(CRLF&"LEVEL1"&"  P"&"  S"&"  E*"&TB&TB&"LEVEL2"&"  P"&
03151	"  S"&"  E*"&TB&TB&"LEVEL3"&"  P"&"  S"&"  E*");
03153		FOR I←0 STEP 1 UNTIL 10 DO  BEGIN SETFORMAT(3,0);
03157	IF LEV1[I]=0 ∧ LEV2[I]=0 ∧ LEV3[I]=0 THEN DONE;
03161		J←LDB(POINT(8,SEG1[I],10)); 
03165		OUTSTR(CRLF&CVXSTR(LEV1[I])&CVS(LDB(POINT(3,SEG1[I],2)))&
03169	       CVS(J)&  CVS(2+J+LDB(POINT(7,SEG1[I],17)))&"*");
03177	 
03181		J←LDB(POINT(8,SEG2[I],10));
03185		OUTSTR(TB&TB&CVXSTR(LEV2[I])&CVS(LDB(POINT(3,SEG2[I],2)))&
03189	     CVS(J)&CVS(2+J+LDB(POINT(7,SEG2[I],17)))&"*");
03197						J←LDB(POINT(8,SEG3[I],10));
03201		OUTSTR(TB&TB&CVXSTR(LEV3[I])&CVS(LDB(POINT(3,SEG3[I],2)))&
03205	CVS(J)&CVS(2+J+LDB(POINT(7,SEG3[I],17)))&"*");
03213		 END; IF SEGLIM≥SEGTOT THEN  DONE ELSE 
03217	BEGIN	SEGLIM←SEGTOT;LOWLIM←90; DPYSET(DPBUF);
03219	 TYPLOC(-250,-510); END; J←INCHWL; END "L3";
03221	
04134	
04140	OPEN(CHAN6,"DSK",0,2,'10,0,0,EOF);
04150	LOOKUP(CHAN6,"TELL.DOC",0);
04160	 DEFINE UGETF="'073000000000";
04170	START_CODE;
04180	 UGETF	6,I;
04190	END;
04200	ENTER(CHAN6,"TELL.DOC",0);
04210	USETO(CHAN6,I);
04220	
04230		
04240	OUT(CHAN6,CRLF&"Name"&TB&"Prob"&TB&"St.Seg"&TB&"SegCnt"&CRLF);
04250		FOR I←0 STEP 1 UNTIL CON1-1 DO 
04260	OUT(CHAN6,CRLF&CVXSTR(LEV1[I])&TB&CVS(LDB(POINT(3,SEG1[I],2)))&
04265	TB& CVS(LDB(POINT(8,SEG1[I],10)))&TB&
04280	 CVS(LDB(POINT(7,SEG1[I],17))));
04290	OUT(CHAN6,CRLF&"LEV2"&CRLF); FOR I←0 STEP 1 UNTIL CON2-1 DO 
04300	OUT(CHAN6,CRLF&CVXSTR(LEV2[I])&TB&CVS(LDB(POINT(3,SEG2[I],2)))&
04305	TB&VS(LDB(POINT(8,SEG2[I],10)))&TB&
04320	 CVS(LDB(POINT(7,SEG2[I],17))));
04330	        OUT(CHAN6,CRLF&"LEV3"&CRLF);
04335	 FOR I←0 STEP 1 UNTIL CON3-1 DO 
04340	OUT(CHAN6,CRLF&CVXSTR(LEV3[I])&TB&CVS(LDB(POINT(3,SEG3[I],2)))&
04345	TB&CVS(LDB(POINT(8,SEG3[I],10)))&TB&
04360	CVS(LDB(POINT(7,SEG3[I],17))));
04370	        OUT(CHAN6,CRLF&CRLF);	CLOSE(CHAN6);
04380	
04390		END "DISP"; END  "RECOG";
04400	
04410	
04420	FOR I←0 STEP 1 UNTIL INSIZ DO INDAT[I]←0;
04425	  HINT←H←0; TABLES[2]←HLIST[0]; ⊂ XXXX ;
04430	FOR I←0 STEP 1 UNTIL 3 DO BEGIN SIG(P);
04435	 IF OPT1="Y" THEN TELL; END;
04440			J←INCHWL;  ⊂ TO WAIT BEFORE OR NEW FILE;
04540	
04580	GO TO START;
     

00010	END "RECOG";